///*******************************************************************************
// * Copyright (c) 2005, 2006 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//
//package org.eclipse.ui.tests.commands;
//
//import java.lang.ref.WeakReference;
//import java.util.Map;
//
//import org.eclipse.core.commands.Command;
//import org.eclipse.ui.commands.AbstractHandler;
//import org.eclipse.ui.commands.HandlerSubmission;
//import org.eclipse.ui.commands.ICommandService;
//import org.eclipse.ui.commands.IHandler;
//import org.eclipse.ui.commands.IWorkbenchCommandSupport;
//import org.eclipse.ui.commands.Priority;
//import org.eclipse.ui.tests.harness.util.UITestCase;
//
///**
// * This tests whether we are leaking handlers after their submission has been
// * removed.
// * 
// * @since 3.1
// */
//public class Bug87856Test extends UITestCase {
//
//	/**
//	 * Constructs a new instance of <code>Bug87856Test</code>.
//	 * 
//	 * @param name
//	 *            The name of the test
//	 */
//	public Bug87856Test(final String name) {
//		super(name);
//	}
//
//	/**
//	 * Tests whether the workbench command support (or its dependencies) will
//	 * leak handlers when the process loop is run. Basically, we're checking to
//	 * see that removing a handler submission really works.
//	 */
//	public final void testHandlerLeak() {
//		final IWorkbenchCommandSupport commandSupport = fWorkbench
//				.getCommandSupport();
//		final ICommandService commandService = (ICommandService) fWorkbench
//				.getAdapter(ICommandService.class);
//		final String commandId = Bug87856Test.class.getName();
//		final Command command = commandService.getCommand(commandId);
//
//		// Submit a handler.
//		IHandler handler = new AbstractHandler() {
//
//			public Object execute(Map parameterValuesByName)
//					throws org.eclipse.ui.commands.ExecutionException {
//				// Do nothing
//				return null;
//			}
//
//		};
//		HandlerSubmission submission = new HandlerSubmission(null, null, null,
//				command.getId(), handler, Priority.MEDIUM);
//		commandSupport.addHandlerSubmission(submission);
//
//		/*
//		 * Remove the handler with no replacement, and hold on to the handler
//		 * via a weak reference.
//		 */
//		commandSupport.removeHandlerSubmission(submission);
//		submission = null;
//		final WeakReference reference = new WeakReference(handler);
//		handler = null;
//
//		// Attempt to force garbage collection.
//		System.gc();
//		System.runFinalization();
//		Thread.yield();
//		System.gc();
//		System.runFinalization();
//		Thread.yield();
//		System.gc();
//		System.runFinalization();
//		Thread.yield();
//
//		// Check to see if the reference has been cleared.
//		assertTrue(
//				"We should not hold on to a handler after the submission has been removed.",
//				reference.isEnqueued() || (reference.get() == null));
//	}
//}
